/*
*********************************************************************************************************
*
*	模块名称 : MODEBUS 通信模块 (主机程序）
*	文件名称 : modbus_host.h
*	版    本 : V1.4
*	说    明 : 头文件
*
*	Copyright (C), 2015-2016, 安富莱电子 www.armfly.com
*
*********************************************************************************************************
*/
#ifndef __MOSBUS_HOST_H
#define __MOSBUS_HOST_H
#include "stm32f10x.h"

#define SlaveSensorAddr 0x01 /* 面板作为时，主板作从机 */
#define SlaveHMIAddr 0x02    /* 面板作为时，主板作从机 */
#define HBAUD485 UART2_BAUD

/* 01H 读强制单线圈 */
/* 05H 写强制单线圈 */
#define REG_D01 0x0101
#define REG_D02 0x0102
#define REG_D03 0x0103
#define REG_D04 0x0104
#define REG_DXX REG_D04

/* 02H 读取输入状态 */
#define REG_T01 0x0201
#define REG_T02 0x0202
#define REG_T03 0x0203
#define REG_TXX REG_T03

/* 03H 读保持寄存器 */
/* 06H 写保持寄存器 */
/* 10H 写多个保存寄存器 */
#define REG_P01 0x0301
#define REG_P02 0x0302

/* 04H 读取输入寄存器(模拟信号) */
#define REG_A01 0x0401
#define REG_AXX REG_A01

/* RTU 应答代码 */
#define RSP_OK 0              /* 成功 */
#define RSP_ERR_CMD 0x01      /* 不支持的功能码 */
#define RSP_ERR_REG_ADDR 0x02 /* 寄存器地址错误 */
#define RSP_ERR_VALUE 0x03    /* 数据值域错误 */
#define RSP_ERR_WRITE 0x04    /* 写入失败 */

#define H_RX_BUF_SIZE 64
#define H_TX_BUF_SIZE 128

typedef struct
{
    uint8_t RxBuf[H_RX_BUF_SIZE];
    uint8_t RxCount;
    uint8_t RxStatus;
    uint8_t RxNewFlag;

    uint8_t RspCode;

    uint8_t TxBuf[H_TX_BUF_SIZE];
    uint8_t TxCount;

    uint16_t Reg01H; /* 保存主机发送的寄存器首地址 */
    uint16_t Reg02H;
    uint16_t Reg03H;
    uint16_t Reg04H;

    uint8_t RegNum; /* 寄存器个数 */

    uint8_t fAck01H; /* 应答命令标志 0 表示执行失败 1表示执行成功 */
    uint8_t fAck02H;
    uint8_t fAck03H;
    uint8_t fAck04H;
    uint8_t fAck05H;
    uint8_t fAck06H;
    uint8_t fAck10H;

} MODH_T;

typedef struct
{
    /* 03H 06H 读写保持寄存器 */
    uint16_t P01[8];
    /* 02H 读写离散输入寄存器 */
    uint16_t T01;
    uint16_t T02;
    uint16_t T03;

    /* 04H 读取模拟量寄存器 */
    uint16_t A01;

    /* 01H 05H 读写单个强制线圈 */
    uint16_t D01;
    uint16_t D02;
    uint16_t D03;
    uint16_t D04;

} VAR_T;

void MODH_Poll(void);
uint8_t MODH_ReadParam_01H(uint16_t _reg, uint16_t _num);
uint8_t MODH_ReadParam_02H(uint16_t _reg, uint16_t _num);
uint8_t MODH_ReadParam_03H(uint8_t _addr, uint16_t _reg, uint16_t _num);
uint8_t MODH_ReadParam_04H(uint8_t _addr, uint16_t _reg, uint16_t _num);
uint8_t MODH_WriteParam_05H(uint16_t _reg, uint16_t _value);
uint8_t MODH_WriteParam_06H(uint16_t _reg, uint16_t _value);
uint8_t MODH_WriteParam_10H(uint8_t _addr, uint16_t _reg, uint8_t _num, uint8_t *_buf);

extern MODH_T g_tModH;
extern VAR_T g_tVar[2];

#endif

/***************************** 安富莱电子 www.armfly.com (END OF FILE) *********************************/
